python 一些技巧

  • 润物细无声
  • 2024-04-09 13:30

    读取 pdf

    使用 pdfplumber

    import os
    import sys
    
    import pdfplumber                           # 导入库
    
    dirpath = os.getcwd()
    pdffile = os.path.join(dirpath, "DDI0487K_a_a-profile_architecture_reference_manual.pdf")
    
    file_str = ''
    
    with pdfplumber.open(pdffile) as pdf:       # 加载 pdf 文件,这一步比较慢
        for i in range(1642, 2602):             # 指定页码
            page = pdf.pages[i]
    
            text   = page.extract_text()        # 获取当前页面的文本内容,str 类型
            tables = page.extract_tables()      # 获取当前页面的表格文本,如果有的话是 list
    
            for table in tables:
                print(table)                    # 有的话可以打印表格
    

    pdfplumber 对表格的处理不太好,无边框的也识别不了,文本倒是不错。

    设置源

    [global]
    index-url=http://mirrors.aliyun.com/pypi/simple/
    [install]
    trusted-host=mirrors.aliyun.com
    
    名称 国内python优质仓库源地址
    阿里云 http://mirrors.aliyun.com/pypi/simple/
    清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
    豆瓣(douban) http://pypi.douban.com/simple/
    中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/
    中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/

    整型转换为 2 进制字节序

    def put_byte_code(val):
        byte_lenght = 4             # 转换后字节序字节个数
        byte_order = 'little'       # 'little' 小端,'big' 大端
        byte_signed = False         # 是否带符号
        return val.to_bytes(byte_lenght, byteorder=byte_order, signed=byte_signed)
    

    定义数组

    a = [0]*5                       # 定义数组,元素个数为 20,元素初始值为 0
    b = [{'name':'None'}] * 5       # 定义数组,元素个数为 20,元素初始值为字典(字典有姓名键值对)
    
    print(type(a))                  # 显示数组为列表类型
    print(len(a))                   # 显示数组长度
    print(a)
    print(b)
    

    输出

    <class 'list'>
    5
    [{12: 2}, {12: 2}, {12: 2}, {12: 2}, {12: 2}]
    [{'name': 'None'}, {'name': 'None'}, {'name': 'None'}, {'name': 'None'}, {'name': 'None'}]
    

    需要注意的是,上面定义的 b 数组,它的所有元素都指向的是同一个字典对象。本质上,这种定义方式,是将同一个对象的引用赋值到数组中每个元素中。下面是一个定义数组,然后初始化为不同对象例子:

    length = 5                      # 定义数组长度
    a = [None] * length             # 定义数组,即 5 个 none 的列表
    
    i = 0
    while i < length:
        a[i] = list()               # 对每个列表元素赋值为一个单独的列表
        i += 1
    

    函数指针

    普通方法

    直接赋值

    def foo(a, b):
        return a + b
    
    fp = foo
    

    使用 types 方法

    为了创建函数指针,我们可以使用 Python 内置的 types 模块中的 FunctionType 函数。该函数接受三个参数:

    我们可以使用 globals() 函数获取全局命名空间,并传递给FunctionType函数。以下是创建函数指针的示例代码:

    import types
    
    def foo(a, b):
        return a + b
    
    fp = types.FunctionType(foo.__code__, globals())
    

    在上述代码中,foo.__code__ 表示函数 foo 的代码对象。globals()函数返回全局命名空间,我们将其传递给 FunctionType 函数以创建函数指针。

    lambda 函数

    语法

    lambda [arg1 [,arg2 ... argn]]:expression

    特性

    lambda x,y:x*y              # 函数输入是x和y,输出是它们的积x*y
    lambda:none                 # 函数没有输入参数,输出是None
    lambda *args: sum(args)     # 输入是任意个数参数,输出是它们的和(隐性要求输入参数必须能进行算术运算)
    lambda **kwargs: 1          # 输入是任意键值对参数,输出是1
    

    常见用法

    由于 lambda 语法是固定的,其本质上只有一种用法,那就是定义一个 lambda 函数。在实际中,根据这个 lambda 函数应用场景的不同,可以将 lambda 函数的用法扩展为以下几种:

    多线程

    threading

    import threading                            # 导入 threading 库
    
    class thread(threading.Thread):             # 创建 thread 类继承 threading.Thread
        def __init__(self,func,arg):
            threading.Thread.__init__(self)     # 初始化基类
            self.func=func                      # 设置工作函数
            self.arg=arg                        # 设置参数
            self.setDaemon(True)                # 设置为守护线程
            self.ThreadStop = False             # 控制线程运行的变量
    
        def run(self):                          # 覆盖 run 函数
            while self.ThreadStop == False:
                self.func(self.arg)             # 调用工作函数,传入参数
                self.ThreadStop = True          # 已经结束
    
        def stop(self):                         # 覆盖 stop 函数
            self.ThreadStop = True              # 设置线程结束
    
    worker = thread(func)                       # 创建工作线程
    worker.start()                              # 启动工作线程
    

    © 2022-2024 留校察看 liuxocakn 保留所有权利 All Rights Reserved
    蜀ICP证2022022862号-1 川公网安备51010702003077号

    自 2024-04-23 22:54 之后访问量: 66155